﻿using System;
using System.Windows.Input;

// ReSharper disable CheckNamespace
public class RelayCommand : ICommand
// ReSharper restore CheckNamespace
{
  #region Fields

  readonly Action<object> _execute;
  readonly Predicate<object> _canExecute;

  #endregion // Fields

  #region Constructors

  public RelayCommand(Action<object> execute)
    : this(execute, null)
  {
  }

  public RelayCommand(Action<object> execute, Predicate<object> canExecute)
  {
    if (execute == null)
      throw new ArgumentNullException("execute");

    _execute = execute;
    _canExecute = canExecute;
  }
  #endregion // Constructors

  #region ICommand Members

  public bool CanExecute(object parameter)
  {
    return _canExecute == null || _canExecute(parameter);
  }

  public event EventHandler CanExecuteChanged
  {
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
  }

  public void Execute(object parameter)
  {
    _execute(parameter);
  }

  #endregion // ICommand Members
}